Generated by Cython 3.0.2

Yellow lines hint at Python interaction.
Click on a line that starts with a "+" to see the C code that Cython generated for it.

Raw output: noise_add_simplex.c

+001: # cython: infer_types=True, wraparound=False, nonecheck=False, boundscheck=False, cdivision=True, language_level=3, profile=False, autogen_pxd=True
  __pyx_t_10 = __Pyx_PyDict_NewPresized(0); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 1, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_10);
  if (PyDict_SetItem(__pyx_d, __pyx_n_s_test, __pyx_t_10) < 0) __PYX_ERR(0, 1, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
 002: 
 003: # Import necessary libraries
+004: import numpy as np
  __pyx_t_7 = __Pyx_ImportDottedModule(__pyx_n_s_numpy, NULL); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 4, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_7);
  if (PyDict_SetItem(__pyx_d, __pyx_n_s_np, __pyx_t_7) < 0) __PYX_ERR(0, 4, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
 005: 
 006: cimport numpy as np
 007: from libc.stdlib cimport free, malloc
 008: 
 009: from cython.parallel import prange
 010: 
 011: 
+012: def get_simplex_noise(int rows, int columns, *args, **kwargs):
/* Python wrapper */
static PyObject *__pyx_pw_7nanopyx_4core_8generate_17noise_add_simplex_1get_simplex_noise(PyObject *__pyx_self, 
#if CYTHON_METH_FASTCALL
PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
#else
PyObject *__pyx_args, PyObject *__pyx_kwds
#endif
); /*proto*/
PyDoc_STRVAR(__pyx_doc_7nanopyx_4core_8generate_17noise_add_simplex_get_simplex_noise, "\n    Get a simplex noise image\n    :param rows: The number of rows\n    :type rows: int\n    :param columns: The number of columns\n    :type columns: int\n    :param args: The arguments to pass to the simplex noise function (see :func:`add_simplex_noise`)\n    :param kwargs: The keyword arguments to pass to the simplex noise function\n    :return: The simplex noise image\n    :rtype: np.ndarray\n    ");
static PyMethodDef __pyx_mdef_7nanopyx_4core_8generate_17noise_add_simplex_1get_simplex_noise = {"get_simplex_noise", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7nanopyx_4core_8generate_17noise_add_simplex_1get_simplex_noise, __Pyx_METH_FASTCALL|METH_KEYWORDS, __pyx_doc_7nanopyx_4core_8generate_17noise_add_simplex_get_simplex_noise};
static PyObject *__pyx_pw_7nanopyx_4core_8generate_17noise_add_simplex_1get_simplex_noise(PyObject *__pyx_self, 
#if CYTHON_METH_FASTCALL
PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
#else
PyObject *__pyx_args, PyObject *__pyx_kwds
#endif
) {
  int __pyx_v_rows;
  int __pyx_v_columns;
  PyObject *__pyx_v_args = 0;
  PyObject *__pyx_v_kwargs = 0;
  #if !CYTHON_METH_FASTCALL
  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
  #endif
  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("get_simplex_noise (wrapper)", 0);
  #if !CYTHON_METH_FASTCALL
  #if CYTHON_ASSUME_SAFE_MACROS
  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
  #else
  __pyx_nargs = PyTuple_Size(__pyx_args);
  if (unlikely((__pyx_nargs < 0))) __PYX_ERR(0, 12, __pyx_L3_error)
  #endif
  #endif
  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
  __pyx_v_kwargs = PyDict_New(); if (unlikely(!__pyx_v_kwargs)) return NULL;
  __Pyx_GOTREF(__pyx_v_kwargs);
  __pyx_v_args = __Pyx_ArgsSlice_FASTCALL(__pyx_args, 2, __pyx_nargs);
  if (unlikely(!__pyx_v_args)) {
    __Pyx_DECREF(__pyx_v_kwargs); __pyx_v_kwargs = 0;
    __Pyx_RefNannyFinishContext();
    return NULL;
  }
  __Pyx_GOTREF(__pyx_v_args);
  {
    PyObject **__pyx_pyargnames[] = {&__pyx_n_s_rows,&__pyx_n_s_columns,0};
  PyObject* values[2] = {0,0};
    if (__pyx_kwds) {
      Py_ssize_t kw_args;
      switch (__pyx_nargs) {
        default:
        case  2: values[1] = __Pyx_Arg_FASTCALL(__pyx_args, 1);
        CYTHON_FALLTHROUGH;
        case  1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
        CYTHON_FALLTHROUGH;
        case  0: break;
      }
      kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds);
      switch (__pyx_nargs) {
        case  0:
        if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_rows)) != 0)) {
          (void)__Pyx_Arg_NewRef_FASTCALL(values[0]);
          kw_args--;
        }
        else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 12, __pyx_L3_error)
        else goto __pyx_L5_argtuple_error;
        CYTHON_FALLTHROUGH;
        case  1:
        if (likely((values[1] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_columns)) != 0)) {
          (void)__Pyx_Arg_NewRef_FASTCALL(values[1]);
          kw_args--;
        }
        else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 12, __pyx_L3_error)
        else {
          __Pyx_RaiseArgtupleInvalid("get_simplex_noise", 0, 2, 2, 1); __PYX_ERR(0, 12, __pyx_L3_error)
        }
      }
      if (unlikely(kw_args > 0)) {
        const Py_ssize_t kwd_pos_args = __pyx_nargs;
        const Py_ssize_t used_pos_args = (kwd_pos_args < 2) ? kwd_pos_args : 2;
        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, __pyx_v_kwargs, values + 0, used_pos_args, "get_simplex_noise") < 0)) __PYX_ERR(0, 12, __pyx_L3_error)
      }
    } else if (unlikely(__pyx_nargs < 2)) {
      goto __pyx_L5_argtuple_error;
    } else {
      values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
      values[1] = __Pyx_Arg_FASTCALL(__pyx_args, 1);
    }
    __pyx_v_rows = __Pyx_PyInt_As_int(values[0]); if (unlikely((__pyx_v_rows == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 12, __pyx_L3_error)
    __pyx_v_columns = __Pyx_PyInt_As_int(values[1]); if (unlikely((__pyx_v_columns == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 12, __pyx_L3_error)
  }
  goto __pyx_L4_argument_unpacking_done;
  __pyx_L5_argtuple_error:;
  __Pyx_RaiseArgtupleInvalid("get_simplex_noise", 0, 2, 2, __pyx_nargs); __PYX_ERR(0, 12, __pyx_L3_error)
  goto __pyx_L3_error;
  __pyx_L3_error:;
  {
    Py_ssize_t __pyx_temp;
    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
    }
  }
  __Pyx_DECREF(__pyx_v_args); __pyx_v_args = 0;
  __Pyx_DECREF(__pyx_v_kwargs); __pyx_v_kwargs = 0;
  __Pyx_AddTraceback("nanopyx.core.generate.noise_add_simplex.get_simplex_noise", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __Pyx_RefNannyFinishContext();
  return NULL;
  __pyx_L4_argument_unpacking_done:;
  __pyx_r = __pyx_pf_7nanopyx_4core_8generate_17noise_add_simplex_get_simplex_noise(__pyx_self, __pyx_v_rows, __pyx_v_columns, __pyx_v_args, __pyx_v_kwargs);
  int __pyx_lineno = 0;
  const char *__pyx_filename = NULL;
  int __pyx_clineno = 0;

  /* function exit code */
  __Pyx_DECREF(__pyx_v_args);
  __Pyx_DECREF(__pyx_v_kwargs);
  {
    Py_ssize_t __pyx_temp;
    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
    }
  }
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_7nanopyx_4core_8generate_17noise_add_simplex_get_simplex_noise(CYTHON_UNUSED PyObject *__pyx_self, int __pyx_v_rows, int __pyx_v_columns, PyObject *__pyx_v_args, PyObject *__pyx_v_kwargs) {
  PyObject *__pyx_v_frames = NULL;
  PyObject *__pyx_v_image = NULL;
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("get_simplex_noise", 0);
/* … */
  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_2);
  __Pyx_XDECREF(__pyx_t_3);
  __Pyx_XDECREF(__pyx_t_4);
  __Pyx_XDECREF(__pyx_t_5);
  __Pyx_XDECREF(__pyx_t_6);
  __Pyx_AddTraceback("nanopyx.core.generate.noise_add_simplex.get_simplex_noise", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XDECREF(__pyx_v_frames);
  __Pyx_XDECREF(__pyx_v_image);
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
/* … */
  __pyx_tuple__24 = PyTuple_Pack(6, __pyx_n_s_rows, __pyx_n_s_columns, __pyx_n_s_args, __pyx_n_s_kwargs, __pyx_n_s_frames, __pyx_n_s_image); if (unlikely(!__pyx_tuple__24)) __PYX_ERR(0, 12, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__24);
  __Pyx_GIVEREF(__pyx_tuple__24);
/* … */
  __pyx_t_7 = __Pyx_CyFunction_New(&__pyx_mdef_7nanopyx_4core_8generate_17noise_add_simplex_1get_simplex_noise, 0, __pyx_n_s_get_simplex_noise, NULL, __pyx_n_s_nanopyx_core_generate_noise_add, __pyx_d, ((PyObject *)__pyx_codeobj__25)); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 12, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_7);
  if (PyDict_SetItem(__pyx_d, __pyx_n_s_get_simplex_noise, __pyx_t_7) < 0) __PYX_ERR(0, 12, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
  __pyx_codeobj__25 = (PyObject*)__Pyx_PyCode_New(2, 0, 0, 6, 0, CO_OPTIMIZED|CO_NEWLOCALS|CO_VARARGS|CO_VARKEYWORDS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__24, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_src_nanopyx_core_generate_noise, __pyx_n_s_get_simplex_noise, 12, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__25)) __PYX_ERR(0, 12, __pyx_L1_error)
 013:     """
 014:     Get a simplex noise image
 015:     :param rows: The number of rows
 016:     :type rows: int
 017:     :param columns: The number of columns
 018:     :type columns: int
 019:     :param args: The arguments to pass to the simplex noise function (see :func:`add_simplex_noise`)
 020:     :param kwargs: The keyword arguments to pass to the simplex noise function
 021:     :return: The simplex noise image
 022:     :rtype: np.ndarray
 023:     """
+024:     if "frames" in kwargs:
  __pyx_t_1 = (__Pyx_PyDict_ContainsTF(__pyx_n_u_frames, __pyx_v_kwargs, Py_EQ)); if (unlikely((__pyx_t_1 < 0))) __PYX_ERR(0, 24, __pyx_L1_error)
  if (__pyx_t_1) {
/* … */
    goto __pyx_L3;
  }
+025:         frames = kwargs["frames"]
    __pyx_t_2 = __Pyx_PyDict_GetItem(__pyx_v_kwargs, __pyx_n_u_frames); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 25, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_2);
    __pyx_v_frames = __pyx_t_2;
    __pyx_t_2 = 0;
+026:         image = np.zeros((frames, rows, columns), dtype=np.float32)
    __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_np); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 26, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_2);
    __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_zeros); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 26, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_3);
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
    __pyx_t_2 = __Pyx_PyInt_From_int(__pyx_v_rows); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 26, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_2);
    __pyx_t_4 = __Pyx_PyInt_From_int(__pyx_v_columns); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 26, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_4);
    __pyx_t_5 = PyTuple_New(3); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 26, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_5);
    __Pyx_INCREF(__pyx_v_frames);
    __Pyx_GIVEREF(__pyx_v_frames);
    if (__Pyx_PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_v_frames)) __PYX_ERR(0, 26, __pyx_L1_error);
    __Pyx_GIVEREF(__pyx_t_2);
    if (__Pyx_PyTuple_SET_ITEM(__pyx_t_5, 1, __pyx_t_2)) __PYX_ERR(0, 26, __pyx_L1_error);
    __Pyx_GIVEREF(__pyx_t_4);
    if (__Pyx_PyTuple_SET_ITEM(__pyx_t_5, 2, __pyx_t_4)) __PYX_ERR(0, 26, __pyx_L1_error);
    __pyx_t_2 = 0;
    __pyx_t_4 = 0;
    __pyx_t_4 = PyTuple_New(1); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 26, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_4);
    __Pyx_GIVEREF(__pyx_t_5);
    if (__Pyx_PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_5)) __PYX_ERR(0, 26, __pyx_L1_error);
    __pyx_t_5 = 0;
    __pyx_t_5 = __Pyx_PyDict_NewPresized(1); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 26, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_5);
    __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_np); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 26, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_2);
    __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_float32); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 26, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_6);
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
    if (PyDict_SetItem(__pyx_t_5, __pyx_n_s_dtype, __pyx_t_6) < 0) __PYX_ERR(0, 26, __pyx_L1_error)
    __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
    __pyx_t_6 = __Pyx_PyObject_Call(__pyx_t_3, __pyx_t_4, __pyx_t_5); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 26, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_6);
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
    __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
    __pyx_v_image = __pyx_t_6;
    __pyx_t_6 = 0;
+027:         del kwargs["frames"]
    if (unlikely((PyDict_DelItem(__pyx_v_kwargs, __pyx_n_u_frames) < 0))) __PYX_ERR(0, 27, __pyx_L1_error)
 028:     else:
+029:         image = np.zeros((rows, columns), dtype=np.float32)
  /*else*/ {
    __Pyx_GetModuleGlobalName(__pyx_t_6, __pyx_n_s_np); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 29, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_6);
    __pyx_t_5 = __Pyx_PyObject_GetAttrStr(__pyx_t_6, __pyx_n_s_zeros); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 29, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_5);
    __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
    __pyx_t_6 = __Pyx_PyInt_From_int(__pyx_v_rows); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 29, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_6);
    __pyx_t_4 = __Pyx_PyInt_From_int(__pyx_v_columns); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 29, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_4);
    __pyx_t_3 = PyTuple_New(2); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 29, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_3);
    __Pyx_GIVEREF(__pyx_t_6);
    if (__Pyx_PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_6)) __PYX_ERR(0, 29, __pyx_L1_error);
    __Pyx_GIVEREF(__pyx_t_4);
    if (__Pyx_PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_t_4)) __PYX_ERR(0, 29, __pyx_L1_error);
    __pyx_t_6 = 0;
    __pyx_t_4 = 0;
    __pyx_t_4 = PyTuple_New(1); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 29, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_4);
    __Pyx_GIVEREF(__pyx_t_3);
    if (__Pyx_PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_3)) __PYX_ERR(0, 29, __pyx_L1_error);
    __pyx_t_3 = 0;
    __pyx_t_3 = __Pyx_PyDict_NewPresized(1); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 29, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_3);
    __Pyx_GetModuleGlobalName(__pyx_t_6, __pyx_n_s_np); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 29, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_6);
    __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_6, __pyx_n_s_float32); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 29, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_2);
    __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
    if (PyDict_SetItem(__pyx_t_3, __pyx_n_s_dtype, __pyx_t_2) < 0) __PYX_ERR(0, 29, __pyx_L1_error)
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
    __pyx_t_2 = __Pyx_PyObject_Call(__pyx_t_5, __pyx_t_4, __pyx_t_3); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 29, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_2);
    __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
    __pyx_v_image = __pyx_t_2;
    __pyx_t_2 = 0;
  }
  __pyx_L3:;
+030:     add_simplex_noise(image, *args, **kwargs)
  __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_add_simplex_noise); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 30, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 30, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_INCREF(__pyx_v_image);
  __Pyx_GIVEREF(__pyx_v_image);
  if (__Pyx_PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_v_image)) __PYX_ERR(0, 30, __pyx_L1_error);
  __pyx_t_4 = PyNumber_Add(__pyx_t_3, __pyx_v_args); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 30, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __pyx_t_3 = PyDict_Copy(__pyx_v_kwargs); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 30, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __pyx_t_5 = __Pyx_PyObject_Call(__pyx_t_2, __pyx_t_4, __pyx_t_3); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 30, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_5);
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
+031:     return image
  __Pyx_XDECREF(__pyx_r);
  __Pyx_INCREF(__pyx_v_image);
  __pyx_r = __pyx_v_image;
  goto __pyx_L0;
 032: 
 033: 
+034: def add_simplex_noise(dataset: np.ndarray, double frequency = 0.01, int octaves = 4, double persistence = 2, double amplitude = 1000, double offset = 1000, int seed = -1):
/* Python wrapper */
static PyObject *__pyx_pw_7nanopyx_4core_8generate_17noise_add_simplex_3add_simplex_noise(PyObject *__pyx_self, 
#if CYTHON_METH_FASTCALL
PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
#else
PyObject *__pyx_args, PyObject *__pyx_kwds
#endif
); /*proto*/
PyDoc_STRVAR(__pyx_doc_7nanopyx_4core_8generate_17noise_add_simplex_2add_simplex_noise, "\n    Add simplex noise to a 2D numpy array.\n    :param im: The 2D numpy array to add noise to.\n    :param frequency: The frequency of the noise.\n    :param octaves: The number of octaves to use.\n    :param persistence: The persistence of the noise.\n    :param amplitude: The amplitude of the noise.\n    :param offset: The offset of the noise.\n    :param seed: The seed to use for the noise generator, if -1 a random seed will be used.\n    ");
static PyMethodDef __pyx_mdef_7nanopyx_4core_8generate_17noise_add_simplex_3add_simplex_noise = {"add_simplex_noise", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_7nanopyx_4core_8generate_17noise_add_simplex_3add_simplex_noise, __Pyx_METH_FASTCALL|METH_KEYWORDS, __pyx_doc_7nanopyx_4core_8generate_17noise_add_simplex_2add_simplex_noise};
static PyObject *__pyx_pw_7nanopyx_4core_8generate_17noise_add_simplex_3add_simplex_noise(PyObject *__pyx_self, 
#if CYTHON_METH_FASTCALL
PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
#else
PyObject *__pyx_args, PyObject *__pyx_kwds
#endif
) {
  PyArrayObject *__pyx_v_dataset = 0;
  double __pyx_v_frequency;
  int __pyx_v_octaves;
  double __pyx_v_persistence;
  double __pyx_v_amplitude;
  double __pyx_v_offset;
  int __pyx_v_seed;
  #if !CYTHON_METH_FASTCALL
  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
  #endif
  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("add_simplex_noise (wrapper)", 0);
  #if !CYTHON_METH_FASTCALL
  #if CYTHON_ASSUME_SAFE_MACROS
  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
  #else
  __pyx_nargs = PyTuple_Size(__pyx_args);
  if (unlikely((__pyx_nargs < 0))) __PYX_ERR(0, 34, __pyx_L3_error)
  #endif
  #endif
  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
  {
    PyObject **__pyx_pyargnames[] = {&__pyx_n_s_dataset,&__pyx_n_s_frequency,&__pyx_n_s_octaves,&__pyx_n_s_persistence,&__pyx_n_s_amplitude,&__pyx_n_s_offset,&__pyx_n_s_seed,0};
  PyObject* values[7] = {0,0,0,0,0,0,0};
    if (__pyx_kwds) {
      Py_ssize_t kw_args;
      switch (__pyx_nargs) {
        case  7: values[6] = __Pyx_Arg_FASTCALL(__pyx_args, 6);
        CYTHON_FALLTHROUGH;
        case  6: values[5] = __Pyx_Arg_FASTCALL(__pyx_args, 5);
        CYTHON_FALLTHROUGH;
        case  5: values[4] = __Pyx_Arg_FASTCALL(__pyx_args, 4);
        CYTHON_FALLTHROUGH;
        case  4: values[3] = __Pyx_Arg_FASTCALL(__pyx_args, 3);
        CYTHON_FALLTHROUGH;
        case  3: values[2] = __Pyx_Arg_FASTCALL(__pyx_args, 2);
        CYTHON_FALLTHROUGH;
        case  2: values[1] = __Pyx_Arg_FASTCALL(__pyx_args, 1);
        CYTHON_FALLTHROUGH;
        case  1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
        CYTHON_FALLTHROUGH;
        case  0: break;
        default: goto __pyx_L5_argtuple_error;
      }
      kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds);
      switch (__pyx_nargs) {
        case  0:
        if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_dataset)) != 0)) {
          (void)__Pyx_Arg_NewRef_FASTCALL(values[0]);
          kw_args--;
        }
        else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 34, __pyx_L3_error)
        else goto __pyx_L5_argtuple_error;
        CYTHON_FALLTHROUGH;
        case  1:
        if (kw_args > 0) {
          PyObject* value = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_frequency);
          if (value) { values[1] = __Pyx_Arg_NewRef_FASTCALL(value); kw_args--; }
          else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 34, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  2:
        if (kw_args > 0) {
          PyObject* value = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_octaves);
          if (value) { values[2] = __Pyx_Arg_NewRef_FASTCALL(value); kw_args--; }
          else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 34, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  3:
        if (kw_args > 0) {
          PyObject* value = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_persistence);
          if (value) { values[3] = __Pyx_Arg_NewRef_FASTCALL(value); kw_args--; }
          else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 34, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  4:
        if (kw_args > 0) {
          PyObject* value = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_amplitude);
          if (value) { values[4] = __Pyx_Arg_NewRef_FASTCALL(value); kw_args--; }
          else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 34, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  5:
        if (kw_args > 0) {
          PyObject* value = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_offset);
          if (value) { values[5] = __Pyx_Arg_NewRef_FASTCALL(value); kw_args--; }
          else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 34, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  6:
        if (kw_args > 0) {
          PyObject* value = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_seed);
          if (value) { values[6] = __Pyx_Arg_NewRef_FASTCALL(value); kw_args--; }
          else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 34, __pyx_L3_error)
        }
      }
      if (unlikely(kw_args > 0)) {
        const Py_ssize_t kwd_pos_args = __pyx_nargs;
        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "add_simplex_noise") < 0)) __PYX_ERR(0, 34, __pyx_L3_error)
      }
    } else {
      switch (__pyx_nargs) {
        case  7: values[6] = __Pyx_Arg_FASTCALL(__pyx_args, 6);
        CYTHON_FALLTHROUGH;
        case  6: values[5] = __Pyx_Arg_FASTCALL(__pyx_args, 5);
        CYTHON_FALLTHROUGH;
        case  5: values[4] = __Pyx_Arg_FASTCALL(__pyx_args, 4);
        CYTHON_FALLTHROUGH;
        case  4: values[3] = __Pyx_Arg_FASTCALL(__pyx_args, 3);
        CYTHON_FALLTHROUGH;
        case  3: values[2] = __Pyx_Arg_FASTCALL(__pyx_args, 2);
        CYTHON_FALLTHROUGH;
        case  2: values[1] = __Pyx_Arg_FASTCALL(__pyx_args, 1);
        CYTHON_FALLTHROUGH;
        case  1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0);
        break;
        default: goto __pyx_L5_argtuple_error;
      }
    }
    __pyx_v_dataset = ((PyArrayObject *)values[0]);
    if (values[1]) {
      __pyx_v_frequency = __pyx_PyFloat_AsDouble(values[1]); if (unlikely((__pyx_v_frequency == (double)-1) && PyErr_Occurred())) __PYX_ERR(0, 34, __pyx_L3_error)
    } else {
      __pyx_v_frequency = ((double)((double)0.01));
    }
    if (values[2]) {
      __pyx_v_octaves = __Pyx_PyInt_As_int(values[2]); if (unlikely((__pyx_v_octaves == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 34, __pyx_L3_error)
    } else {
      __pyx_v_octaves = ((int)((int)4));
    }
    if (values[3]) {
      __pyx_v_persistence = __pyx_PyFloat_AsDouble(values[3]); if (unlikely((__pyx_v_persistence == (double)-1) && PyErr_Occurred())) __PYX_ERR(0, 34, __pyx_L3_error)
    } else {
      __pyx_v_persistence = ((double)((double)2.0));
    }
    if (values[4]) {
      __pyx_v_amplitude = __pyx_PyFloat_AsDouble(values[4]); if (unlikely((__pyx_v_amplitude == (double)-1) && PyErr_Occurred())) __PYX_ERR(0, 34, __pyx_L3_error)
    } else {
      __pyx_v_amplitude = ((double)((double)1000.0));
    }
    if (values[5]) {
      __pyx_v_offset = __pyx_PyFloat_AsDouble(values[5]); if (unlikely((__pyx_v_offset == (double)-1) && PyErr_Occurred())) __PYX_ERR(0, 34, __pyx_L3_error)
    } else {
      __pyx_v_offset = ((double)((double)1000.0));
    }
    if (values[6]) {
      __pyx_v_seed = __Pyx_PyInt_As_int(values[6]); if (unlikely((__pyx_v_seed == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 34, __pyx_L3_error)
    } else {
      __pyx_v_seed = ((int)((int)-1));
    }
  }
  goto __pyx_L4_argument_unpacking_done;
  __pyx_L5_argtuple_error:;
  __Pyx_RaiseArgtupleInvalid("add_simplex_noise", 0, 1, 7, __pyx_nargs); __PYX_ERR(0, 34, __pyx_L3_error)
  goto __pyx_L3_error;
  __pyx_L3_error:;
  {
    Py_ssize_t __pyx_temp;
    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
    }
  }
  __Pyx_AddTraceback("nanopyx.core.generate.noise_add_simplex.add_simplex_noise", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __Pyx_RefNannyFinishContext();
  return NULL;
  __pyx_L4_argument_unpacking_done:;
  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_dataset), __pyx_ptype_5numpy_ndarray, 0, "dataset", 0))) __PYX_ERR(0, 34, __pyx_L1_error)
  __pyx_r = __pyx_pf_7nanopyx_4core_8generate_17noise_add_simplex_2add_simplex_noise(__pyx_self, __pyx_v_dataset, __pyx_v_frequency, __pyx_v_octaves, __pyx_v_persistence, __pyx_v_amplitude, __pyx_v_offset, __pyx_v_seed);
  int __pyx_lineno = 0;
  const char *__pyx_filename = NULL;
  int __pyx_clineno = 0;

  /* function exit code */
  goto __pyx_L0;
  __pyx_L1_error:;
  __pyx_r = NULL;
  __pyx_L0:;
  {
    Py_ssize_t __pyx_temp;
    for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
      __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]);
    }
  }
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_7nanopyx_4core_8generate_17noise_add_simplex_2add_simplex_noise(CYTHON_UNUSED PyObject *__pyx_self, PyArrayObject *__pyx_v_dataset, double __pyx_v_frequency, int __pyx_v_octaves, double __pyx_v_persistence, double __pyx_v_amplitude, double __pyx_v_offset, int __pyx_v_seed) {
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("add_simplex_noise", 0);
  __Pyx_INCREF((PyObject *)__pyx_v_dataset);
/* … */
  /* function exit code */
  __pyx_r = Py_None; __Pyx_INCREF(Py_None);
  goto __pyx_L0;
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_2);
  __Pyx_XDECREF(__pyx_t_3);
  __Pyx_XDECREF(__pyx_t_5);
  __Pyx_XDECREF(__pyx_t_6);
  __PYX_XCLEAR_MEMVIEW(&__pyx_t_7, 1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_t_8, 1);
  __PYX_XCLEAR_MEMVIEW(&__pyx_t_9, 1);
  __Pyx_AddTraceback("nanopyx.core.generate.noise_add_simplex.add_simplex_noise", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XDECREF((PyObject *)__pyx_v_dataset);
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
/* … */
  __pyx_tuple__26 = PyTuple_Pack(7, __pyx_n_s_dataset, __pyx_n_s_frequency, __pyx_n_s_octaves, __pyx_n_s_persistence, __pyx_n_s_amplitude, __pyx_n_s_offset, __pyx_n_s_seed); if (unlikely(!__pyx_tuple__26)) __PYX_ERR(0, 34, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__26);
  __Pyx_GIVEREF(__pyx_tuple__26);
/* … */
  __pyx_t_7 = PyFloat_FromDouble(((double)0.01)); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 34, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_7);
  __pyx_t_4 = __Pyx_PyInt_From_int(((int)4)); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 34, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __pyx_t_5 = PyFloat_FromDouble(((double)2.0)); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 34, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_5);
  __pyx_t_9 = PyFloat_FromDouble(((double)1000.0)); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 34, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_9);
  __pyx_t_10 = PyFloat_FromDouble(((double)1000.0)); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 34, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_10);
  __pyx_t_11 = __Pyx_PyInt_From_int(((int)-1)); if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 34, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_11);
  __pyx_t_12 = PyTuple_New(6); if (unlikely(!__pyx_t_12)) __PYX_ERR(0, 34, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_12);
  __Pyx_GIVEREF(__pyx_t_7);
  if (__Pyx_PyTuple_SET_ITEM(__pyx_t_12, 0, __pyx_t_7)) __PYX_ERR(0, 34, __pyx_L1_error);
  __Pyx_GIVEREF(__pyx_t_4);
  if (__Pyx_PyTuple_SET_ITEM(__pyx_t_12, 1, __pyx_t_4)) __PYX_ERR(0, 34, __pyx_L1_error);
  __Pyx_GIVEREF(__pyx_t_5);
  if (__Pyx_PyTuple_SET_ITEM(__pyx_t_12, 2, __pyx_t_5)) __PYX_ERR(0, 34, __pyx_L1_error);
  __Pyx_GIVEREF(__pyx_t_9);
  if (__Pyx_PyTuple_SET_ITEM(__pyx_t_12, 3, __pyx_t_9)) __PYX_ERR(0, 34, __pyx_L1_error);
  __Pyx_GIVEREF(__pyx_t_10);
  if (__Pyx_PyTuple_SET_ITEM(__pyx_t_12, 4, __pyx_t_10)) __PYX_ERR(0, 34, __pyx_L1_error);
  __Pyx_GIVEREF(__pyx_t_11);
  if (__Pyx_PyTuple_SET_ITEM(__pyx_t_12, 5, __pyx_t_11)) __PYX_ERR(0, 34, __pyx_L1_error);
  __pyx_t_7 = 0;
  __pyx_t_4 = 0;
  __pyx_t_5 = 0;
  __pyx_t_9 = 0;
  __pyx_t_10 = 0;
  __pyx_t_11 = 0;
  __pyx_t_11 = __Pyx_PyDict_NewPresized(1); if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 34, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_11);
  if (PyDict_SetItem(__pyx_t_11, __pyx_n_s_dataset, __pyx_kp_s_np_ndarray) < 0) __PYX_ERR(0, 34, __pyx_L1_error)
  __pyx_t_10 = __Pyx_CyFunction_New(&__pyx_mdef_7nanopyx_4core_8generate_17noise_add_simplex_3add_simplex_noise, 0, __pyx_n_s_add_simplex_noise, NULL, __pyx_n_s_nanopyx_core_generate_noise_add, __pyx_d, ((PyObject *)__pyx_codeobj__27)); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 34, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_10);
  __Pyx_CyFunction_SetDefaultsTuple(__pyx_t_10, __pyx_t_12);
  __Pyx_CyFunction_SetAnnotationsDict(__pyx_t_10, __pyx_t_11);
  __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
  __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
  if (PyDict_SetItem(__pyx_d, __pyx_n_s_add_simplex_noise, __pyx_t_10) < 0) __PYX_ERR(0, 34, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
 035:     """
 036:     Add simplex noise to a 2D numpy array.
 037:     :param im: The 2D numpy array to add noise to.
 038:     :param frequency: The frequency of the noise.
 039:     :param octaves: The number of octaves to use.
 040:     :param persistence: The persistence of the noise.
 041:     :param amplitude: The amplitude of the noise.
 042:     :param offset: The offset of the noise.
 043:     :param seed: The seed to use for the noise generator, if -1 a random seed will be used.
 044:     """
+045:     if seed == -1:
  __pyx_t_1 = (__pyx_v_seed == -1L);
  if (__pyx_t_1) {
/* … */
  }
+046:         seed = np.random.randint(0, 1000000)
    __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_np); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 46, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_2);
    __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_random); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 46, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_3);
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
    __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_randint); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 46, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_2);
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
    __pyx_t_3 = __Pyx_PyObject_Call(__pyx_t_2, __pyx_tuple__11, NULL); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 46, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_3);
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
    __pyx_t_4 = __Pyx_PyInt_As_int(__pyx_t_3); if (unlikely((__pyx_t_4 == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 46, __pyx_L1_error)
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
    __pyx_v_seed = __pyx_t_4;
/* … */
  __pyx_tuple__11 = PyTuple_Pack(2, __pyx_int_0, __pyx_int_1000000); if (unlikely(!__pyx_tuple__11)) __PYX_ERR(0, 46, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__11);
  __Pyx_GIVEREF(__pyx_tuple__11);
 047: 
+048:     assert frequency > 0, "The frequency must be greater than 0."
  #ifndef CYTHON_WITHOUT_ASSERTIONS
  if (unlikely(__pyx_assertions_enabled())) {
    __pyx_t_1 = (__pyx_v_frequency > 0.0);
    if (unlikely(!__pyx_t_1)) {
      __Pyx_Raise(__pyx_builtin_AssertionError, __pyx_kp_u_The_frequency_must_be_greater_th, 0, 0);
      __PYX_ERR(0, 48, __pyx_L1_error)
    }
  }
  #else
  if ((1)); else __PYX_ERR(0, 48, __pyx_L1_error)
  #endif
+049:     assert octaves > 0, "The number of octaves must be greater than 0."
  #ifndef CYTHON_WITHOUT_ASSERTIONS
  if (unlikely(__pyx_assertions_enabled())) {
    __pyx_t_1 = (__pyx_v_octaves > 0);
    if (unlikely(!__pyx_t_1)) {
      __Pyx_Raise(__pyx_builtin_AssertionError, __pyx_kp_u_The_number_of_octaves_must_be_gr, 0, 0);
      __PYX_ERR(0, 49, __pyx_L1_error)
    }
  }
  #else
  if ((1)); else __PYX_ERR(0, 49, __pyx_L1_error)
  #endif
+050:     assert persistence > 0, "The persistence must be greater than 0."
  #ifndef CYTHON_WITHOUT_ASSERTIONS
  if (unlikely(__pyx_assertions_enabled())) {
    __pyx_t_1 = (__pyx_v_persistence > 0.0);
    if (unlikely(!__pyx_t_1)) {
      __Pyx_Raise(__pyx_builtin_AssertionError, __pyx_kp_u_The_persistence_must_be_greater, 0, 0);
      __PYX_ERR(0, 50, __pyx_L1_error)
    }
  }
  #else
  if ((1)); else __PYX_ERR(0, 50, __pyx_L1_error)
  #endif
 051: 
 052:     # Convert the imay to a 2D numpy array
+053:     dataset = dataset.view(np.float32)
  __pyx_t_2 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_dataset), __pyx_n_s_view); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 53, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_GetModuleGlobalName(__pyx_t_5, __pyx_n_s_np); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 53, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_5);
  __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_t_5, __pyx_n_s_float32); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 53, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_6);
  __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
  __pyx_t_5 = NULL;
  __pyx_t_4 = 0;
  #if CYTHON_UNPACK_METHODS
  if (likely(PyMethod_Check(__pyx_t_2))) {
    __pyx_t_5 = PyMethod_GET_SELF(__pyx_t_2);
    if (likely(__pyx_t_5)) {
      PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_2);
      __Pyx_INCREF(__pyx_t_5);
      __Pyx_INCREF(function);
      __Pyx_DECREF_SET(__pyx_t_2, function);
      __pyx_t_4 = 1;
    }
  }
  #endif
  {
    PyObject *__pyx_callargs[2] = {__pyx_t_5, __pyx_t_6};
    __pyx_t_3 = __Pyx_PyObject_FastCall(__pyx_t_2, __pyx_callargs+1-__pyx_t_4, 1+__pyx_t_4);
    __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0;
    __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
    if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 53, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_3);
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  }
  if (!(likely(((__pyx_t_3) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_3, __pyx_ptype_5numpy_ndarray))))) __PYX_ERR(0, 53, __pyx_L1_error)
  __Pyx_DECREF_SET(__pyx_v_dataset, ((PyArrayObject *)__pyx_t_3));
  __pyx_t_3 = 0;
 054: 
+055:     if dataset.ndim == 2:
  __pyx_t_4 = __pyx_f_5numpy_7ndarray_4ndim_ndim(__pyx_v_dataset); if (unlikely(__pyx_t_4 == ((int)-1) && PyErr_Occurred())) __PYX_ERR(0, 55, __pyx_L1_error)
  __pyx_t_1 = (__pyx_t_4 == 2);
  if (__pyx_t_1) {
/* … */
    goto __pyx_L4;
  }
+056:         _add_simplex_noise_2D(dataset, frequency, octaves, persistence, amplitude, offset, seed)
    __pyx_t_7 = __Pyx_PyObject_to_MemoryviewSlice_dsds_float(((PyObject *)__pyx_v_dataset), PyBUF_WRITABLE); if (unlikely(!__pyx_t_7.memview)) __PYX_ERR(0, 56, __pyx_L1_error)
    __pyx_f_7nanopyx_4core_8generate_17noise_add_simplex__add_simplex_noise_2D(__pyx_t_7, __pyx_v_frequency, __pyx_v_octaves, __pyx_v_persistence, __pyx_v_amplitude, __pyx_v_offset, __pyx_v_seed); if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 56, __pyx_L1_error)
    __PYX_XCLEAR_MEMVIEW(&__pyx_t_7, 1);
    __pyx_t_7.memview = NULL; __pyx_t_7.data = NULL;
+057:     elif dataset.ndim == 3:
  __pyx_t_4 = __pyx_f_5numpy_7ndarray_4ndim_ndim(__pyx_v_dataset); if (unlikely(__pyx_t_4 == ((int)-1) && PyErr_Occurred())) __PYX_ERR(0, 57, __pyx_L1_error)
  __pyx_t_1 = (__pyx_t_4 == 3);
  if (__pyx_t_1) {
/* … */
    goto __pyx_L4;
  }
+058:         _add_simplex_noise_3D(dataset, frequency, octaves, persistence, amplitude, offset, seed)
    __pyx_t_8 = __Pyx_PyObject_to_MemoryviewSlice_dsdsds_float(((PyObject *)__pyx_v_dataset), PyBUF_WRITABLE); if (unlikely(!__pyx_t_8.memview)) __PYX_ERR(0, 58, __pyx_L1_error)
    __pyx_f_7nanopyx_4core_8generate_17noise_add_simplex__add_simplex_noise_3D(__pyx_t_8, __pyx_v_frequency, __pyx_v_octaves, __pyx_v_persistence, __pyx_v_amplitude, __pyx_v_offset, __pyx_v_seed); if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 58, __pyx_L1_error)
    __PYX_XCLEAR_MEMVIEW(&__pyx_t_8, 1);
    __pyx_t_8.memview = NULL; __pyx_t_8.data = NULL;
+059:     elif dataset.ndim == 4:
  __pyx_t_4 = __pyx_f_5numpy_7ndarray_4ndim_ndim(__pyx_v_dataset); if (unlikely(__pyx_t_4 == ((int)-1) && PyErr_Occurred())) __PYX_ERR(0, 59, __pyx_L1_error)
  __pyx_t_1 = (__pyx_t_4 == 4);
  if (likely(__pyx_t_1)) {
/* … */
    goto __pyx_L4;
  }
+060:         _add_simplex_noise_4D(dataset, frequency, octaves, persistence, amplitude, offset, seed)
    __pyx_t_9 = __Pyx_PyObject_to_MemoryviewSlice_dsdsdsds_float(((PyObject *)__pyx_v_dataset), PyBUF_WRITABLE); if (unlikely(!__pyx_t_9.memview)) __PYX_ERR(0, 60, __pyx_L1_error)
    __pyx_f_7nanopyx_4core_8generate_17noise_add_simplex__add_simplex_noise_4D(__pyx_t_9, __pyx_v_frequency, __pyx_v_octaves, __pyx_v_persistence, __pyx_v_amplitude, __pyx_v_offset, __pyx_v_seed); if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 60, __pyx_L1_error)
    __PYX_XCLEAR_MEMVIEW(&__pyx_t_9, 1);
    __pyx_t_9.memview = NULL; __pyx_t_9.data = NULL;
 061:     else:
+062:         raise ValueError("The image must be 2D, 3D, or 4D.")
  /*else*/ {
    __pyx_t_3 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple__12, NULL); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 62, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_3);
    __Pyx_Raise(__pyx_t_3, 0, 0, 0);
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
    __PYX_ERR(0, 62, __pyx_L1_error)
  }
  __pyx_L4:;
/* … */
  __pyx_tuple__12 = PyTuple_Pack(1, __pyx_kp_u_The_image_must_be_2D_3D_or_4D); if (unlikely(!__pyx_tuple__12)) __PYX_ERR(0, 62, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__12);
  __Pyx_GIVEREF(__pyx_tuple__12);
 063: 
+064: cdef void _add_simplex_noise_2D(float[:,:] im, double frequency, int octaves, double persistence, double amplitude, double offset, int seed) nogil:
static void __pyx_f_7nanopyx_4core_8generate_17noise_add_simplex__add_simplex_noise_2D(__Pyx_memviewslice __pyx_v_im, double __pyx_v_frequency, int __pyx_v_octaves, double __pyx_v_persistence, double __pyx_v_amplitude, double __pyx_v_offset, int __pyx_v_seed) {
  CYTHON_UNUSED int __pyx_v_rows;
  int __pyx_v_cols;
  double __pyx_v_noise;
  int __pyx_v_r;
  int __pyx_v_c;
  int __pyx_v_o;
  OpenSimplexEnv *__pyx_v_ose;
  OpenSimplexGradients *__pyx_v_osg;
/* … */
  /* function exit code */
}
+065:     cdef int rows = im.shape[0]
  __pyx_v_rows = (__pyx_v_im.shape[0]);
+066:     cdef int cols = im.shape[1]
  __pyx_v_cols = (__pyx_v_im.shape[1]);
 067:     cdef double noise
 068:     cdef int r, c, o
 069: 
 070:     # Initialize the noise generator
+071:     cdef OpenSimplexEnv *ose = initOpenSimplex()
  __pyx_v_ose = initOpenSimplex();
+072:     cdef OpenSimplexGradients *osg = newOpenSimplexGradients(ose, seed)
  __pyx_v_osg = newOpenSimplexGradients(__pyx_v_ose, __pyx_v_seed);
 073: 
 074:     # Loop through each element in the imay
+075:     for r in prange(rows):
  {
      #ifdef WITH_THREAD
      PyThreadState *_save;
      _save = NULL;
      if (PyGILState_Check()) {
        Py_UNBLOCK_THREADS
      }
      __Pyx_FastGIL_Remember();
      #endif
      /*try:*/ {
        __pyx_t_1 = __pyx_v_rows;
        {
            #if ((defined(__APPLE__) || defined(__OSX__)) && (defined(__GNUC__) && (__GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95)))))
                #undef likely
                #undef unlikely
                #define likely(x)   (x)
                #define unlikely(x) (x)
            #endif
            __pyx_t_3 = (__pyx_t_1 - 0 + 1 - 1/abs(1)) / 1;
            if (__pyx_t_3 > 0)
            {
                #ifdef _OPENMP
                #pragma omp parallel
                #endif /* _OPENMP */
                {
                    #ifdef _OPENMP
                    #pragma omp for lastprivate(__pyx_v_c) reduction(+:__pyx_v_noise) lastprivate(__pyx_v_o) firstprivate(__pyx_v_r) lastprivate(__pyx_v_r)
                    #endif /* _OPENMP */
                    for (__pyx_t_2 = 0; __pyx_t_2 < __pyx_t_3; __pyx_t_2++){
                        {
                            __pyx_v_r = (int)(0 + 1 * __pyx_t_2);
                            /* Initialize private variables to invalid values */
                            __pyx_v_c = ((int)0xbad0bad0);
                            __pyx_v_o = ((int)0xbad0bad0);
/* … */
      /*finally:*/ {
        /*normal exit:*/{
          #ifdef WITH_THREAD
          __Pyx_FastGIL_Forget();
          if (_save) {
            Py_BLOCK_THREADS
          }
          #endif
          goto __pyx_L5;
        }
        __pyx_L5:;
      }
  }
+076:         for c in range(cols):
                            __pyx_t_4 = __pyx_v_cols;
                            __pyx_t_5 = __pyx_t_4;
                            for (__pyx_t_6 = 0; __pyx_t_6 < __pyx_t_5; __pyx_t_6+=1) {
                              __pyx_v_c = __pyx_t_6;
 077:             # Calculate the simplex noise for the current x,y position
+078:             noise = 0
                              __pyx_v_noise = 0.0;
+079:             for o in range(octaves):
                              __pyx_t_7 = __pyx_v_octaves;
                              __pyx_t_8 = __pyx_t_7;
                              for (__pyx_t_9 = 0; __pyx_t_9 < __pyx_t_8; __pyx_t_9+=1) {
                                __pyx_v_o = __pyx_t_9;
+080:                 noise += (noise2(ose, osg, r * frequency * 2**o, c * frequency * 2**o) + 1) / 2 * persistence**o
                                __pyx_v_noise = (__pyx_v_noise + (((noise2(__pyx_v_ose, __pyx_v_osg, ((__pyx_v_r * __pyx_v_frequency) * pow(2.0, ((double)__pyx_v_o))), ((__pyx_v_c * __pyx_v_frequency) * pow(2.0, ((double)__pyx_v_o)))) + 1.0) / 2.0) * pow(__pyx_v_persistence, ((double)__pyx_v_o))));
                              }
 081: 
 082:             # Add the noise to the current imay element
+083:             im[r,c] += noise * amplitude + offset
                              __pyx_t_10 = __pyx_v_r;
                              __pyx_t_11 = __pyx_v_c;
                              *((float *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_im.data + __pyx_t_10 * __pyx_v_im.strides[0]) ) + __pyx_t_11 * __pyx_v_im.strides[1]) )) += ((__pyx_v_noise * __pyx_v_amplitude) + __pyx_v_offset);
                            }
                        }
                    }
                }
            }
        }
        #if ((defined(__APPLE__) || defined(__OSX__)) && (defined(__GNUC__) && (__GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95)))))
            #undef likely
            #undef unlikely
            #define likely(x)   __builtin_expect(!!(x), 1)
            #define unlikely(x) __builtin_expect(!!(x), 0)
        #endif
      }
 084: 
 085:     # Free the memory used by the OpenSimplex environment and gradients
+086:     free(osg)
  free(__pyx_v_osg);
+087:     free(ose)
  free(__pyx_v_ose);
 088: 
+089: cdef void _add_simplex_noise_3D(float[:,:,:] im, double frequency, int octaves, double persistence, double amplitude, double offset, int seed) nogil:
static void __pyx_f_7nanopyx_4core_8generate_17noise_add_simplex__add_simplex_noise_3D(__Pyx_memviewslice __pyx_v_im, double __pyx_v_frequency, int __pyx_v_octaves, double __pyx_v_persistence, double __pyx_v_amplitude, double __pyx_v_offset, int __pyx_v_seed) {
  CYTHON_UNUSED int __pyx_v_rows;
  int __pyx_v_cols;
  int __pyx_v_depth;
  double __pyx_v_noise;
  int __pyx_v_r;
  int __pyx_v_c;
  int __pyx_v_d;
  int __pyx_v_o;
  OpenSimplexEnv *__pyx_v_ose;
  OpenSimplexGradients *__pyx_v_osg;
/* … */
  /* function exit code */
}
+090:     cdef int rows = im.shape[0]
  __pyx_v_rows = (__pyx_v_im.shape[0]);
+091:     cdef int cols = im.shape[1]
  __pyx_v_cols = (__pyx_v_im.shape[1]);
+092:     cdef int depth = im.shape[2]
  __pyx_v_depth = (__pyx_v_im.shape[2]);
 093:     cdef double noise
 094:     cdef int r, c, d, o
 095: 
 096:     # Initialize the noise generator
+097:     cdef OpenSimplexEnv *ose = initOpenSimplex()
  __pyx_v_ose = initOpenSimplex();
+098:     cdef OpenSimplexGradients *osg = newOpenSimplexGradients(ose, seed)
  __pyx_v_osg = newOpenSimplexGradients(__pyx_v_ose, __pyx_v_seed);
 099: 
 100:     # Loop through each element in the imay
+101:     for r in prange(rows):
  {
      #ifdef WITH_THREAD
      PyThreadState *_save;
      _save = NULL;
      if (PyGILState_Check()) {
        Py_UNBLOCK_THREADS
      }
      __Pyx_FastGIL_Remember();
      #endif
      /*try:*/ {
        __pyx_t_1 = __pyx_v_rows;
        {
            #if ((defined(__APPLE__) || defined(__OSX__)) && (defined(__GNUC__) && (__GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95)))))
                #undef likely
                #undef unlikely
                #define likely(x)   (x)
                #define unlikely(x) (x)
            #endif
            __pyx_t_3 = (__pyx_t_1 - 0 + 1 - 1/abs(1)) / 1;
            if (__pyx_t_3 > 0)
            {
                #ifdef _OPENMP
                #pragma omp parallel
                #endif /* _OPENMP */
                {
                    #ifdef _OPENMP
                    #pragma omp for lastprivate(__pyx_v_c) lastprivate(__pyx_v_d) reduction(+:__pyx_v_noise) lastprivate(__pyx_v_o) firstprivate(__pyx_v_r) lastprivate(__pyx_v_r)
                    #endif /* _OPENMP */
                    for (__pyx_t_2 = 0; __pyx_t_2 < __pyx_t_3; __pyx_t_2++){
                        {
                            __pyx_v_r = (int)(0 + 1 * __pyx_t_2);
                            /* Initialize private variables to invalid values */
                            __pyx_v_c = ((int)0xbad0bad0);
                            __pyx_v_d = ((int)0xbad0bad0);
                            __pyx_v_o = ((int)0xbad0bad0);
/* … */
      /*finally:*/ {
        /*normal exit:*/{
          #ifdef WITH_THREAD
          __Pyx_FastGIL_Forget();
          if (_save) {
            Py_BLOCK_THREADS
          }
          #endif
          goto __pyx_L5;
        }
        __pyx_L5:;
      }
  }
+102:         for c in range(cols):
                            __pyx_t_4 = __pyx_v_cols;
                            __pyx_t_5 = __pyx_t_4;
                            for (__pyx_t_6 = 0; __pyx_t_6 < __pyx_t_5; __pyx_t_6+=1) {
                              __pyx_v_c = __pyx_t_6;
+103:             for d in range(depth):
                              __pyx_t_7 = __pyx_v_depth;
                              __pyx_t_8 = __pyx_t_7;
                              for (__pyx_t_9 = 0; __pyx_t_9 < __pyx_t_8; __pyx_t_9+=1) {
                                __pyx_v_d = __pyx_t_9;
 104:                 # Calculate the simplex noise for the current x,y,z position
+105:                 noise = 0
                                __pyx_v_noise = 0.0;
+106:                 for o in range(octaves):
                                __pyx_t_10 = __pyx_v_octaves;
                                __pyx_t_11 = __pyx_t_10;
                                for (__pyx_t_12 = 0; __pyx_t_12 < __pyx_t_11; __pyx_t_12+=1) {
                                  __pyx_v_o = __pyx_t_12;
+107:                     noise += (noise3_Classic(ose, osg, r * frequency * 2**o, c * frequency * 2**o, d * frequency * 2**o) + 1) / 2 * persistence**o
                                  __pyx_v_noise = (__pyx_v_noise + (((noise3_Classic(__pyx_v_ose, __pyx_v_osg, ((__pyx_v_r * __pyx_v_frequency) * pow(2.0, ((double)__pyx_v_o))), ((__pyx_v_c * __pyx_v_frequency) * pow(2.0, ((double)__pyx_v_o))), ((__pyx_v_d * __pyx_v_frequency) * pow(2.0, ((double)__pyx_v_o)))) + 1.0) / 2.0) * pow(__pyx_v_persistence, ((double)__pyx_v_o))));
                                }
 108: 
 109:                 # Add the noise to the current imay element
+110:                 im[r,c,d] += noise * amplitude + offset
                                __pyx_t_13 = __pyx_v_r;
                                __pyx_t_14 = __pyx_v_c;
                                __pyx_t_15 = __pyx_v_d;
                                *((float *) ( /* dim=2 */ (( /* dim=1 */ (( /* dim=0 */ (__pyx_v_im.data + __pyx_t_13 * __pyx_v_im.strides[0]) ) + __pyx_t_14 * __pyx_v_im.strides[1]) ) + __pyx_t_15 * __pyx_v_im.strides[2]) )) += ((__pyx_v_noise * __pyx_v_amplitude) + __pyx_v_offset);
                              }
                            }
                        }
                    }
                }
            }
        }
        #if ((defined(__APPLE__) || defined(__OSX__)) && (defined(__GNUC__) && (__GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95)))))
            #undef likely
            #undef unlikely
            #define likely(x)   __builtin_expect(!!(x), 1)
            #define unlikely(x) __builtin_expect(!!(x), 0)
        #endif
      }
 111: 
 112:     # Free the memory used by the OpenSimplex environment and gradients
+113:     free(osg)
  free(__pyx_v_osg);
+114:     free(ose)
  free(__pyx_v_ose);
 115: 
+116: cdef void _add_simplex_noise_4D(float[:,:,:,:] im, double frequency, int octaves, double persistence, double amplitude, double offset, int seed) nogil:
static void __pyx_f_7nanopyx_4core_8generate_17noise_add_simplex__add_simplex_noise_4D(__Pyx_memviewslice __pyx_v_im, double __pyx_v_frequency, int __pyx_v_octaves, double __pyx_v_persistence, double __pyx_v_amplitude, double __pyx_v_offset, int __pyx_v_seed) {
  CYTHON_UNUSED int __pyx_v_rows;
  int __pyx_v_cols;
  int __pyx_v_depth;
  int __pyx_v_time;
  double __pyx_v_noise;
  int __pyx_v_r;
  int __pyx_v_c;
  int __pyx_v_d;
  int __pyx_v_t;
  int __pyx_v_o;
  OpenSimplexEnv *__pyx_v_ose;
  OpenSimplexGradients *__pyx_v_osg;
/* … */
  /* function exit code */
}
+117:     cdef int rows = im.shape[0]
  __pyx_v_rows = (__pyx_v_im.shape[0]);
+118:     cdef int cols = im.shape[1]
  __pyx_v_cols = (__pyx_v_im.shape[1]);
+119:     cdef int depth = im.shape[2]
  __pyx_v_depth = (__pyx_v_im.shape[2]);
+120:     cdef int time = im.shape[3]
  __pyx_v_time = (__pyx_v_im.shape[3]);
 121:     cdef double noise
 122:     cdef int r, c, d, t, o
 123: 
 124:     # Initialize the noise generator
+125:     cdef OpenSimplexEnv *ose = initOpenSimplex()
  __pyx_v_ose = initOpenSimplex();
+126:     cdef OpenSimplexGradients *osg = newOpenSimplexGradients(ose, seed)
  __pyx_v_osg = newOpenSimplexGradients(__pyx_v_ose, __pyx_v_seed);
 127: 
 128:     # Loop through each element in the imay
+129:     for r in prange(rows):
  {
      #ifdef WITH_THREAD
      PyThreadState *_save;
      _save = NULL;
      if (PyGILState_Check()) {
        Py_UNBLOCK_THREADS
      }
      __Pyx_FastGIL_Remember();
      #endif
      /*try:*/ {
        __pyx_t_1 = __pyx_v_rows;
        {
            #if ((defined(__APPLE__) || defined(__OSX__)) && (defined(__GNUC__) && (__GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95)))))
                #undef likely
                #undef unlikely
                #define likely(x)   (x)
                #define unlikely(x) (x)
            #endif
            __pyx_t_3 = (__pyx_t_1 - 0 + 1 - 1/abs(1)) / 1;
            if (__pyx_t_3 > 0)
            {
                #ifdef _OPENMP
                #pragma omp parallel
                #endif /* _OPENMP */
                {
                    #ifdef _OPENMP
                    #pragma omp for lastprivate(__pyx_v_c) lastprivate(__pyx_v_d) reduction(+:__pyx_v_noise) lastprivate(__pyx_v_o) firstprivate(__pyx_v_r) lastprivate(__pyx_v_r) lastprivate(__pyx_v_t)
                    #endif /* _OPENMP */
                    for (__pyx_t_2 = 0; __pyx_t_2 < __pyx_t_3; __pyx_t_2++){
                        {
                            __pyx_v_r = (int)(0 + 1 * __pyx_t_2);
                            /* Initialize private variables to invalid values */
                            __pyx_v_c = ((int)0xbad0bad0);
                            __pyx_v_d = ((int)0xbad0bad0);
                            __pyx_v_o = ((int)0xbad0bad0);
                            __pyx_v_t = ((int)0xbad0bad0);
/* … */
      /*finally:*/ {
        /*normal exit:*/{
          #ifdef WITH_THREAD
          __Pyx_FastGIL_Forget();
          if (_save) {
            Py_BLOCK_THREADS
          }
          #endif
          goto __pyx_L5;
        }
        __pyx_L5:;
      }
  }
+130:         for c in range(cols):
                            __pyx_t_4 = __pyx_v_cols;
                            __pyx_t_5 = __pyx_t_4;
                            for (__pyx_t_6 = 0; __pyx_t_6 < __pyx_t_5; __pyx_t_6+=1) {
                              __pyx_v_c = __pyx_t_6;
+131:             for d in range(depth):
                              __pyx_t_7 = __pyx_v_depth;
                              __pyx_t_8 = __pyx_t_7;
                              for (__pyx_t_9 = 0; __pyx_t_9 < __pyx_t_8; __pyx_t_9+=1) {
                                __pyx_v_d = __pyx_t_9;
+132:                 for t in range(time):
                                __pyx_t_10 = __pyx_v_time;
                                __pyx_t_11 = __pyx_t_10;
                                for (__pyx_t_12 = 0; __pyx_t_12 < __pyx_t_11; __pyx_t_12+=1) {
                                  __pyx_v_t = __pyx_t_12;
 133:                     # Calculate the simplex noise for the current x,y,z,t position
+134:                     noise = 0
                                  __pyx_v_noise = 0.0;
+135:                     for o in range(octaves):
                                  __pyx_t_13 = __pyx_v_octaves;
                                  __pyx_t_14 = __pyx_t_13;
                                  for (__pyx_t_15 = 0; __pyx_t_15 < __pyx_t_14; __pyx_t_15+=1) {
                                    __pyx_v_o = __pyx_t_15;
+136:                         noise += (noise4_Classic(ose, osg, r * frequency * 2**o, c * frequency * 2**o, d * frequency * 2**o, t * frequency * 2**o) + 1) / 2 * persistence**o
                                    __pyx_v_noise = (__pyx_v_noise + (((noise4_Classic(__pyx_v_ose, __pyx_v_osg, ((__pyx_v_r * __pyx_v_frequency) * pow(2.0, ((double)__pyx_v_o))), ((__pyx_v_c * __pyx_v_frequency) * pow(2.0, ((double)__pyx_v_o))), ((__pyx_v_d * __pyx_v_frequency) * pow(2.0, ((double)__pyx_v_o))), ((__pyx_v_t * __pyx_v_frequency) * pow(2.0, ((double)__pyx_v_o)))) + 1.0) / 2.0) * pow(__pyx_v_persistence, ((double)__pyx_v_o))));
                                  }
 137: 
 138:                     # Add the noise to the current imay element
+139:                     im[r,c,d,t] += noise * amplitude + offset
                                  __pyx_t_16 = __pyx_v_r;
                                  __pyx_t_17 = __pyx_v_c;
                                  __pyx_t_18 = __pyx_v_d;
                                  __pyx_t_19 = __pyx_v_t;
                                  *((float *) ( /* dim=3 */ (( /* dim=2 */ (( /* dim=1 */ (( /* dim=0 */ (__pyx_v_im.data + __pyx_t_16 * __pyx_v_im.strides[0]) ) + __pyx_t_17 * __pyx_v_im.strides[1]) ) + __pyx_t_18 * __pyx_v_im.strides[2]) ) + __pyx_t_19 * __pyx_v_im.strides[3]) )) += ((__pyx_v_noise * __pyx_v_amplitude) + __pyx_v_offset);
                                }
                              }
                            }
                        }
                    }
                }
            }
        }
        #if ((defined(__APPLE__) || defined(__OSX__)) && (defined(__GNUC__) && (__GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95)))))
            #undef likely
            #undef unlikely
            #define likely(x)   __builtin_expect(!!(x), 1)
            #define unlikely(x) __builtin_expect(!!(x), 0)
        #endif
      }
 140: 
 141:     # Free the memory used by the OpenSimplex environment and gradients
+142:     free(osg)
  free(__pyx_v_osg);
+143:     free(ose)
  free(__pyx_v_ose);